package com.aliwo.rereflect;

import com.aliwo.Cat;

/**
 * 获取Class对象的六种方式.
 *
 * @author Xu Yayuan
 * @date 2022/2/21
 */
public class GetClass {
    public static void main(String[] args) throws Exception{

        // 第一种编译阶段,前提，已知一个类的全类名，且该类在类路径下，多用于配置文件，读取类的全路径，加载类
        Class cls1 = Class.forName("com.aliwo.Cat");
        System.out.println("cls1:"+cls1);

        // 第二种，类加载的时候，若已知具体的类，通过类的class获取，该方式最为安全可靠，程序性能最高，
        Class cls2 = Cat.class;
        System.out.println("cls2:" + cls2);

        // 第三种 ，运行阶段 已知某个类的实例调用该类的getClass()获取Class对象
        Cat cat = new Cat();
        Class cls3 = cat.getClass();
        System.out.println("cls3:" + cls3);

        // 第四种 若已知具体的类，通过类的class获取，该方式最为安全可靠，程序性能最高，
        ClassLoader classLoader = cat.getClass().getClassLoader();
        Class cls4 = classLoader.loadClass("com.aliwo.Cat");
        System.out.println("Class对象在堆内存中只存在一份，所有这四种方式获取的hashCode相同");
        System.out.println("cls4:" + cls4);
        System.out.println("cls1 hashCode :" + cls1.hashCode());
        System.out.println("cls2 hashCode :" + cls2.hashCode());
        System.out.println("cls3 hashCode :" + cls3.hashCode());
        System.out.println("cls4 hashCode :" + cls4.hashCode());
        // 第五种 基本数据类型(int,char,boolean,float,double,byte,long,shrt) 按这种方式得到Class类对象 Class cls = 基本数据类型.class
        Class cls5 = int.class;
        System.out.println("cls5:" + cls5);
        // 第六种，基本数据类型对应包装类，可以通过.type()得到Class对象 Class cls = 包装类.TYPE
        Class cls6 = Integer.TYPE;
        System.out.println("cls6:"+cls6);
    }
}
